#!/bin/bash

package_name="roadside_awe_module"

# 要打包的目录或者文件
content_list=(
    "/opt/awe/modules"
    "/opt/awe/plugins/module"
)

current_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

function create_customize() {
    # 自定义一些操作写在自定义脚本中
    cat <<EOF >$tmp_dir/customize.sh
#!/bin/bash

EOF
}

function initialize() {
    # 创建临时文件目录
    tmp_dir=$(mktemp -d)

    # 参数1 package file
    if [ -n "$1" ]; then
        package_name=$1
    fi

    # 剩余参数: content list
    # 如果参数个数大于1，则将剩余参数作为content list
    if [ $# -gt 1 ]; then
        content_list=("${@:2}")
    fi

    # 获取CPU架构
    target_arch=$(uname -m)

    # 获取系统版本信息
    source /etc/os-release
    system=$ID"_"$VERSION_ID

    # 打包文件名称
    package_file=$package_name"_"$system"_"$target_arch".run"

    # echo "package_file: $package_file"
    # echo "content_list: ${content_list[@]}"

    # 区分目录和文件
    # 拷贝要打包的目录到临时文件中
    for content in "${content_list[@]}"; do

        # 如果content是目录，则创建目录
        if [ -d "$content" ]; then
            directory=$content
            content_dir_list+=("$content")

            # 在临时目录下创建要打包的目录
            mkdir -p $tmp_dir/$directory

            echo "build package [$directory] ..."

            # 拷贝要打包的内容到临时目录中， 包括隐藏文件
            cp -rdf $content/. $tmp_dir/$directory/.

        else
            # 如果content是文件，则创建文件所在的目录
            directory=$(dirname $content)
            content_file_list+=("$content")

            # 在临时目录下创建要打包的目录
            mkdir -p $tmp_dir/$directory

            echo "build package [$content] ..."

            # 拷贝要打包的内容到临时目录中
            cp -rdf $content $tmp_dir/$directory/.
        fi

    done

    # 生成自定义脚本
    create_customize
}

function finalize() {
    # 删除临时文件
    rm -rf $tmp_dir

    # 赋予执行权限
    chmod +x $current_dir/$package_file

    echo "Package created at $package_file"
}

# 创建header脚本
function create_header() {
    # 生成run文件的header部分,并追加到run文件中
    cat <<EOF >"$current_dir/$package_file"
#!/bin/bash
# This is a run package
# Package name: $package_file
# Author: jie jie
# Created at: $(date)

# 如果传入参数 uninstall，则执行卸载操作
if [ "\$1" == "uninstall" ]; then
    echo "uninstall $package_name ..."

    # 循环遍历要删除的目录内容
    for directory in ${content_dir_list[@]}; do

        echo "uninstall dirs [\$directory] ..."

        # 判断是否有权限删除该目录
        if ! rm -rf \$directory 2>/dev/null; then
            sudo rm -rf \$directory
        fi
    done

    # 循环遍历要删除的文件内容
    for content in ${content_file_list[@]}; do

        echo "uninstall file [\$content] ..."

        # 判断是否有权限删除该文件
        if ! rm -rf \$content 2>/dev/null; then
            sudo rm -rf \$content
        fi
    done

    echo "uninstall $package_name done."
    exit 0
fi

# Creating temporary directory...
tmp_dir=\$(mktemp -d)

# 识别出当前run文件的body字段在第几行
body_line=\$(grep -a -n '^__END_OF_SCRIPT__$' \$0 | cut -d: -f1)

# echo "body_line: \$body_line"

# 提取出body字段并生成tar.gz文件
tail -n +\$(( \$body_line + 1 )) \$0 | tar -xz -C "\$tmp_dir"


# 循环遍历要拷贝的目录内容
for directory in ${content_dir_list[@]}; do
    # echo "directory: \$directory"

    # 判断目录是否存在，如果不存在则创建
    if [ ! -d \$directory ]; then
        echo "create \$directory directory ..."

        # 判断是否有权限创建该目录
        if ! mkdir -p \$directory 2>/dev/null; then
            sudo mkdir -p \$directory
        fi
    fi

    echo "install dirs [\$directory] to [\$directory]"

    # 判断是否有权限拷贝该目录
    if ! cp -rdf \$tmp_dir/\$directory/. \$directory/. 2>/dev/null; then
        sudo cp -rdf \$tmp_dir/\$directory/. \$directory/.
    fi
done

# 循环遍历要拷贝的文件内容
for content in ${content_file_list[@]}; do
    # echo "content: \$content"
    directory=\$(dirname \$content)
    file=\$(basename \$content)

    # 判断目录是否存在，如果不存在则创建
    if [ ! -d \$directory ]; then
        echo "create \$directory directory ..."

        # 判断是否有权限创建该目录
        if ! mkdir -p \$directory 2>/dev/null; then
            sudo mkdir -p \$directory
        fi
    fi

    echo "install file [\$file] to [\$directory] ..."

    # 判断是否有权限拷贝该文件
    if ! cp -rdf \$tmp_dir/\$content \$directory/. 2>/dev/null; then
        sudo cp -rdf \$tmp_dir/\$content \$directory/.
    fi
done


# 执行自定义脚本
if [ -f "\$tmp_dir/customize.sh" ]; then
    # echo "execute customize.sh ..."
    bash \$tmp_dir/customize.sh
fi

rm -rf \$tmp_dir

echo "install success!"

exit 0

__END_OF_SCRIPT__
EOF

}

# 创建body
function create_body() {
    # 进入临时文件夹
    cd $tmp_dir

    # 打包临时文件夹，生成tar.gz文件
    tar -czf package.tar.gz *

    # 追加 /tmp/package.tar.gz 到 $package_file 文件中
    cat package.tar.gz >>$current_dir/$package_file

    cd $current_dir
}

function main() {
    # 初始化
    initialize "$@"

    # 执行创建header和body的函数
    create_header
    create_body

    # 删除临时文件
    finalize
}

main "$@"